package com.nas.crocus.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.nas.crocus.dao.ReservaAlojamientoDao;
import com.nas.crocus.domain.RegistroAlojamiento;
import com.nas.crocus.domain.ReservaAlojamiento;
import com.nas.crocus.service.RegistroAlojamientoService;
import com.nas.crocus.service.ReservaAlojamientoService;

@Service
@Transactional
public class ReservaAlojamientoServiceImpl implements ReservaAlojamientoService {

    @Autowired
    private ReservaAlojamientoDao reservaAlojamientoDao;

    @Autowired
    private RegistroAlojamientoService registroAlojamientoService;

    @Override
    public ReservaAlojamiento obtenerPorRegistroParticipante(
            Long registroAlojamientoId, Long pasajeroId) {
        return reservaAlojamientoDao.obtenerPorClave(registroAlojamientoId,
                pasajeroId);
    }

    public void reservar(ReservaAlojamiento reservaAlojamiento) {

        ReservaAlojamiento reserva = reservaAlojamientoDao
                .obtenerPorPasajeroId(reservaAlojamiento.getPasajeroId());

        
        if (reserva != null) {
            RegistroAlojamiento registroAlojamientoExistente = registroAlojamientoService
                    .obtenerPorAlojamientoId(reserva                   
                            .getRegistroAlojamientoId());
            
            registroAlojamientoExistente
                    .setCantidadHabitacionDoble(registroAlojamientoExistente
                            .getCantidadHabitacionDoble()
                            - reserva.getCantidadHabitacionDoble());
            registroAlojamientoExistente
                    .setCantidadHabitacionOtra(registroAlojamientoExistente
                            .getCantidadHabitacionOtra()
                            - reserva.getCantidadHabitacionOtra());
            registroAlojamientoExistente
                    .setCantidadHabitacionSimple(registroAlojamientoExistente
                            .getCantidadHabitacionSimple()
                            - reserva.getCantidadHabitacionSimple());
            
            registroAlojamientoService.actualizarOGuardar(registroAlojamientoExistente);
        }

        if (reservaAlojamiento.getRegistroAlojamientoId() != null) { 
            RegistroAlojamiento registroAlojamientoAModificar = registroAlojamientoService
                    .obtenerPorAlojamientoId(reservaAlojamiento
                            .getRegistroAlojamientoId());
            
            registroAlojamientoAModificar.setCantidadHabitacionDoble(registroAlojamientoAModificar.getCantidadHabitacionDoble() + reservaAlojamiento.getCantidadHabitacionDoble());
            registroAlojamientoAModificar.setCantidadHabitacionOtra(registroAlojamientoAModificar.getCantidadHabitacionOtra() + reservaAlojamiento.getCantidadHabitacionOtra());
            registroAlojamientoAModificar.setCantidadHabitacionSimple(registroAlojamientoAModificar.getCantidadHabitacionSimple() + reservaAlojamiento.getCantidadHabitacionSimple());
            registroAlojamientoService.actualizarOGuardar(registroAlojamientoAModificar);
    
            if (reserva != null) {
                reserva.setCantidadHabitacionDoble(reservaAlojamiento.getCantidadHabitacionDoble());
                reserva.setCantidadHabitacionOtra(reservaAlojamiento.getCantidadHabitacionOtra());
                reserva.setCantidadHabitacionSimple(reservaAlojamiento.getCantidadHabitacionSimple());
                reserva.setRegistroAlojamientoId(registroAlojamientoAModificar.getId());
                reserva.setModifica(reservaAlojamiento.isModifica());
                reservaAlojamientoDao.actualizar(reserva);
            } else {
                reservaAlojamiento.setRegistroAlojamientoId(registroAlojamientoAModificar.getId());
                reservaAlojamientoDao.guardar(reservaAlojamiento);
            }
        } else {
            if (reserva != null) {
                reservaAlojamientoDao.eliminar(reserva);
            }
        }
    }

}
